from django.core.cache import cache
from django.utils import timezone
from django.shortcuts import render
from rest_framework.permissions import IsAuthenticated  #新增权限类
from rest_framework.response import Response
from rest_framework.views import APIView

from experience.experienceser import IndustrySerializer, JobCategorySerializer, JobTitleSerializer, \
    WorkExperienceSerializer, ProjectExperienceSerializer, IndustrySecondSerializer, JobTitleWithCategorySerializer
from experience.models import Industry, JobCategory, JobTitle, WorkExperience, ProjectExperience


# Create your views here.

class WorkExperienceListView(APIView):
    # 确保用户已登录
    # permission_classes = [IsAuthenticated]

    def get(self, request, format=None):
        try:
            user = request.query_params.get('user', None)
            # 1.行业树（根节点开始） 找出所有“父级行业”为空的行业记录
            industries = Industry.objects.filter(parent=None)
            industry_data = IndustrySerializer(industries, many=True).data

            # 2.职位类别树，从数据库中查找所有“顶级”或“根级”的职位类别，没有上级分类的类别
            categories = JobCategory.objects.filter(parent=None)
            # 将多个 JobCategory 模型实例（categories）通过 JobCategorySerializer 序列化为一个 Python 列表（每个元素是字典），赋值给 category_data。
            category_data = JobCategorySerializer(categories, many=True).data

            # 3.所有启用的职位名称
            job_titles = JobTitle.objects.filter(is_active=True)
            job_title_data = JobTitleSerializer(job_titles, many=True).data

            # 4.当前用户的工作经历（关键修改：添加user=request.user 过滤）
            work_exps = WorkExperience.objects.filter(user=user).select_related(
                'industry', 'position', 'position__category'
            ).order_by('-start_date')
            work_data = WorkExperienceSerializer(work_exps, many=True).data

            data = {
                'industries': industry_data,
                'categories': category_data,
                'job_titles': job_title_data,
                'work_experiences': work_data,
                "meta":{
                    # 计算 work_data 这个列表中有多少条工作经历数据，并将这个数量作为 total 的值。
                    "total": len(work_data),
                    "timestamp" : timezone.now().isoformat()
                }
            }
            return Response(data, status=200)
        except Exception as e:
            return Response({"error": "获取工作经历失败", "detail": str(e)}, status=500)


class ProjectExperienceListView(APIView):
    # 确保用户已登录
    # permission_classes = [IsAuthenticated]
    def get(self, request, format=None):
            try:
                # 请求用户id
                user = request.query_params.get('user', None)
                # 该用户所有启用的项目经历，按开始日期降序排列
                project = ProjectExperience.objects.filter(user=user).order_by('-start_date')
                # 序列化项目经历数据
                project_data = ProjectExperienceSerializer(project, many=True).data

                # 组装最后返回的数据
                data = {
                    "project_experiences": project_data,
                    "meta": {
                        # 项目经验数
                        "total": len(project_data),
                        "timestamp": timezone.now().isoformat()
                    }
                }

                return Response(data, status=200)

            except Exception as e:
                return Response({"error": "获取项目经历失败", "detail": str(e)}, status=500)



class IndustrySecondListView(APIView):
    def get(self, request):
        industries = Industry.objects.filter(
            parent__isnull=False,
            parent__parent__isnull=True,
            is_active=True
        )
        serializer = IndustrySecondSerializer(industries, many=True)
        return Response(serializer.data)


class JobTitleWithCategoryListView(APIView):
    def get(self, request):
        positions = JobTitle.objects.filter(is_active=True)
        serializer = JobTitleWithCategorySerializer(positions, many=True)
        return Response(serializer.data)



# 新增工作经历
class WorkExperienceAddView(APIView):
    """
    工作经历添加视图类
    
    处理工作经历的创建请求，通过POST方法接收用户提交的工作经历信息并保存到数据库。
    使用缓存机制提高行业和职位信息的查询效率。
    
    继承自APIView，提供POST方法处理HTTP POST请求
    """
    # 确保用户已登录
    # permission_classes = [IsAuthenticated]

    def _get_cached_industry_qs(self):
        """
        获取缓存的行业查询集
        
        从缓存中获取有效的子级行业信息，如果缓存不存在则从数据库查询并设置缓存。
        缓存有效期为7天。
        
        Returns:
            QuerySet: 行业查询集，包含所有有效的子级行业
        """
        cache_key = "static_industry_active_children"
        return cache.get_or_set(
            cache_key,
            lambda : Industry.objects.filter(
                parent__isnull=False,
                is_active=True
            ),60*60*24*7
        )


    def _get_cached_position_qs(self):
        """
        获取缓存的职位查询集
        
        从缓存中获取所有有效职位信息，如果缓存不存在则从数据库查询并设置缓存。
        缓存有效期为7天。
        
        Returns:
            QuerySet: 职位查询集，包含所有有效的职位
        """
        cache_key = "static_jobtitle_active"
        return cache.get_or_set(
            cache_key,
            lambda : JobTitle.objects.filter(
                is_active=True
            ),60*60*24*7
        )

    def post(self, request):
        """
        处理POST请求，创建新的工作经历记录
        
        参数:
            request: HTTP请求对象，包含用户提交的工作经历数据
            
        返回:
            Response: 包含保存成功的工作经历数据或错误信息的响应对象
        """
        # 获取缓存的职位和行业信息
        industry_qs = self._get_cached_industry_qs()
        position_qs = self._get_cached_position_qs()

        # 实现序列转换，反序列化将JSON数据转换为Python对象
        serializer = WorkExperienceSerializer(
            data=request.data,
            # 表示反序列化操作
            context={
                # 当前请求对象
                'request': request,
                # 行业查询集
                'industry_qs': industry_qs,
                # 职位查询集
                'position_qs': position_qs
                }
        )

        # 验证数据并保存
        if serializer.is_valid():
            # 保存数据
            serializer.save()
            return Response(serializer.data, status=200)

        return Response(serializer.errors, status=400)


